package test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import org.junit.Test;

import validacion.ValidadorEquivaleA;
import validacion.ValorInvalidoException;
import aspects.ContadorLlamadasPerTargetAspect;
import dominio.Extraterrestre;

/*
 *  Esta clase testea en forma rápida que los aspectos funcionan para 
 *  cualquier clase dentro del paquete 'dominio'.
 *  Notese que todo lo referente a validaciones se ha apartado del paquete 
 *  'dominio', y ahora esta en el paquete 'validaciones'.
 * */
public class ChequeoExpressExtraterrestre { // NUEVO!
	
	@Test
	public void validadores(){
		
		Extraterrestre eT = new Extraterrestre(3); 
		
		eT.agregarValidador("cantidadDeDedos", new ValidadorEquivaleA(3));
		
		int dedos = eT.getCantidadDeDedos();
		
		assertEquals(3, dedos); 
		
		eT.agregarValidador("cantidadDeDedos", new ValidadorEquivaleA(4)); 
		
		try{
			eT.setCantidadDeDedos(4);
			fail("Debería haber lanzado excepción al asignarle un valor que no cumple con ser 3 y a la vez 4");
		
		} catch(ValorInvalidoException e) {
			
			int dedos2 = eT.getCantidadDeDedos();
			assertEquals(3, dedos2);
		}
		
	}
	
	@Test
	public void contadores(){
		
		Extraterrestre eT = new Extraterrestre(3); 
		
		eT.setCantidadDeDedos(5);
		
		int gets = ContadorLlamadasPerTargetAspect.aspectOf(eT).cantLlamadas("getCantidadDeDedos");
		int sets = ContadorLlamadasPerTargetAspect.aspectOf(eT).cantLlamadas("setCantidadDeDedos");
		
		assertEquals(gets, 0);
		assertEquals(sets, 1);
		
	}
	

}
